/*
 * @(#)TimeStyle.java Time: 2013-1-3
 *
 * Copyright 2013 xuedou.com All rights reserved.
 */

package xuedou.skymoni.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import org.apache.log4j.Logger;

/**
 *<pre>类说明</pre>
 *<b>功能描述：</b>
 * 时间样式
 * @author  meiguanghui meiguanghui@xuedou.com
 * @author  weidan weidan@xuedou.com
 * @version 1.0, 2013-1-4
 */
public class TimeStyle {
	
	/**
	 * 按指定的枚举模格式来获得当前时间
	 * @param timeEnum 枚举,里面很多格式,这样做的好处:<br>
	     程序员没有办法传入一个非法的格式,增强了程序的强壮性.
	 * @return  返回用当前时间组成的字符串
	 */
	public static  String getFormatTime(TargetEnum timeEnum) {
		return new SimpleDateFormat(timeEnum.toString()).format(new Date());//按指定的模式取出时间
	}
	
	/**
	 * 将一个符合时间格式的字符串按照一个枚举类型转化成Date
	 * 如果传入的字符串不是一个标准时间格式将会抛出ParseException异常.
	 * @param strTime 符合标准时间格式的字符串
	 * @param timeEnum 枚举
	 * @return 根据字符串转换后的时间
	 */
	public static Date strToTime(String strTime,TargetEnum timeEnum){
		SimpleDateFormat sdf=new SimpleDateFormat(timeEnum.toString());
		Date date=null;
		try {
			date=sdf.parse(strTime);
		} catch (ParseException e) {
			Logger.getLogger(TimeStyle.class).warn(e.toString());
			e.printStackTrace();
		}
		return date;
	}
	
	/**
	 * 计算出当前时间与传入时间的时间间隔
	 * @param timeStr: 接受的时间格式为 yyyy-MM-dd HH:mm:ss
	 * @return 当前时间与传入时间的时间间隔(long型,单位毫秒)
	 */
	public static long getIntervalTime(String timeStr){
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
		Date strTime = null;
		try {
			 strTime = sdf.parse(timeStr);
		} catch (ParseException e) {
			e.printStackTrace();
		}
	
		Calendar cl = Calendar.getInstance();
				 cl.setTime(strTime);
				 
		Calendar clNow = Calendar.getInstance();
		return (clNow.getTimeInMillis() - cl.getTimeInMillis());
	}
	
	/**
	 * 主要用于显示发布的时间
	 * timeStr格式:yyyy-MM-dd HH:mm:ss
	 * @return 经过处理之后的时间字符串
	 */
	public static String getShowTime(String timeStr){
		if(null == timeStr || "".equals(timeStr) || timeStr.length() < 1){
				Logger.getLogger(TimeStyle.class).warn("获取时间时,传入的str有问题");
				return null;
		}
		
		long st = getIntervalTime(timeStr);
		
		/*
		编写返回显示时间
		若:发布时间距离现在的时间间隔为st(单位为毫秒)
		当st>=0 && st<60000 则:刚刚               
		当st>=60000 && st<3600000 则:(st/1000/60)=(st/60000)分钟前
		当st>=3600000 && st<24*3600000 则:(st/1000/60/60)=(st/3600000)小时前
		当st>=24*3600000 && st<96*3600000 则:(st/1000/60/60/24)=(st/86400000)天前 HH:mm
		当st>=96*3600000 则: yyyy-MM-dd HH:mm
		*/
		if(st < 60000){
			return "刚刚";
		}
		
		if(st >= 60000 && st<3600000){
			return (int)(st/60000) + "分钟前";
		}
		
		if(st >= 3600000 && st<24*3600000){
			return (int)(st/3600000) + "小时前";
		}
		
		int indexOf = timeStr.indexOf(":");
		int lastIndexOf = timeStr.lastIndexOf(":");
		
		if(st  >=  24 * 3600000  &&  st<96 * 3600000){
			return new StringBuffer().append((int)(st/86400000)).append("天前").
					append(timeStr.substring(indexOf-2,indexOf)).append(":").
					append(timeStr.substring(lastIndexOf-2,lastIndexOf)).toString();
		}
		
		if(st>=96*3600000){
			return  timeStr.substring(0,lastIndexOf); 
		}
		
		Logger.getLogger(TimeStyle.class).warn("获取时间时,传入的str有问题");
		
		return null;
		
	}
	
	/**
	 * 查询该毫秒数是否超过某时刻到当前时间的距离
	 * @param num
	 * @return
	 */
	  public static boolean isDefferSup(int num,String dateStr){
			SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
			try {
				Date strTime=sdf.parse(dateStr);
				Calendar cl=Calendar.getInstance();
				 cl.setTime(strTime);
				Calendar clNow=Calendar.getInstance();
				long st=clNow.getTimeInMillis()-cl.getTimeInMillis();
				if(num<st){
					return true;
				}
			} catch (ParseException e) {
				e.printStackTrace();
			}
		  return false;
	  }
	    
}
